package 小测试;

/**
 * Created by Administrator on 2017/8/5.
 */
public class OuterClass {
    private int num1=1;//成员变量

    //1、非静态成员内部类的成员变量只能是非静态的。
    public class InnerClass{
        public int num;
//        public static String str; //报错
    }
    public static class StaticInnerClass{
        public int num;
        public static String str;
    }

    //2、局部内部类和匿名内部类访问的局部变量必须是用final修饰的(即必须是自定义常量)
    public void method(){
        int num2=2;
        class inner{
            public void show(){
                System.out.println(num1); //可以正常访问成员变量，因为其存在堆中，不会立即消失
//                System.out.println(num2);//不能正常访问局部变量，因为其访问完后立即消失，
                // 但是局部内部类却要等到垃圾回收期空闲的时候才会去回收它。
            }
        }
    }

    //3、成员内部类为一个接口
    private interface innerInterface{//定义成private，即只有本类中能访问到
        void writeMe();
    }
    public void test(){
        final int num3=3;//匿名内部类访问的 局部变量 必须用final修饰
        new innerInterface(){
            @Override
            public void writeMe() {
                System.out.println(num1);
                System.out.println(num3);
                System.out.println("我是匿名内部类");
            }
        };
    }

    //4、使用内部类的好处：间接实现类多继承效果，隐藏内中细节(private)
    private class innerClassExtend extends This关键字测试 {
    }

    //5、局部变量不能用static修饰
    public void myMethod(){
//        static int temp;//出错！
        final int temp1;//局部变量可以用final修饰

        //6、创建二位数组的方式：
//        int a[][]=new int[][]; //出错！
        int []b[]=new int[1][];
        int c[][]={};
        int d[][]={{1},{2}};

    }
}
